home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / dskut / 22dsk140.zip / DPB.ASM < prev    next >
Assembly Source File  |  1993-10-12  |  5KB  |  343 lines

  1. ;*    Program to display DPB information on CP/M 2.2
  2. ;
  3. ;    For those systems without MS BASIC
  4. ;
  5.  
  6. bdos    equ    0005h        ; BDOS call vector
  7. wboot    equ    0000h        ; Warm boot vector
  8. cdisk    equ    0004h        ; current disk
  9. tpa    equ    0100h        ; TPA start
  10. cr    equ    13        ; return
  11. lf    equ    10        ; line feed
  12. bel    equ    7        ; bell
  13.  
  14.     org    tpa
  15.  
  16. GetDPB:
  17.     call    Strout
  18.     db    cr,lf,'       Parameters for Drive ',0
  19.  
  20.     lda    cdisk
  21.     ani    15
  22.     adi    'A'
  23.     call    chout        ; give a drive letter
  24.  
  25.     call    Strout
  26.     db    ':',cr,lf,lf,0  ; skip a line
  27.  
  28.     lda    cdisk
  29.     mov    c,a
  30.     lhld    wboot+1
  31.     mvi    l,27        ; point to seldisk
  32.     call    Indcall        ; go call (seldisk)
  33.  
  34.     mov    a,h
  35.     ora    l
  36.     jnz    GetDPB2        ; if okay
  37.     call    Strout
  38.     db    cr,lf,bel,'Select error',cr,lf,0
  39.     jmp    wboot        ; exit...
  40.  
  41. GetDPB2:
  42.     shld    DPHaddr        ; save DPH address
  43.     lxi    d,10
  44.     dad    d
  45.     mov    e,m
  46.     inx    h
  47.     mov    d,m        ; get DPB address
  48.     xchg
  49.     shld    DPBaddr        ; save DPB address
  50.  
  51. ;    Show sectors/track.
  52.  
  53.     call    Strout
  54.     db    'Sectors per Track............',0
  55.     mvi    a,0
  56.     call    GetField    ; get a field from the DPB
  57.     shld    SectTrk        ; save it
  58.     call    ShowDec        ; show it
  59.  
  60. ;    If there's a translate table, show it.
  61.  
  62.     lhld    DPHaddr
  63.     mov    e,m
  64.     inx    h
  65.     mov    d,m
  66.     mov    a,d
  67.     ora    e
  68.     jz    GetDPB6        ; if none..
  69.     call    Strout
  70.     db    cr,lf,'Sectors interleaved as follows:',0
  71.  
  72.     lhld    SectTrk        ; get Sectors/track
  73.     mov    b,h
  74.     mov    c,l
  75. GetDPB4:
  76.     call    Strout
  77.     db    cr,lf,'    ',0  ; indent
  78.     ldax    d        ; get a sector
  79.     push    h
  80.     mov    l,a
  81.     mvi    h,0
  82.     call    ShowDec        ; show it
  83.     pop    h
  84.     dcx    b
  85.     mov    a,b
  86.     ora    c
  87.     jnz    GetDPB4        ; loop...
  88.     jmp    GetDPB8        ; do the rest...
  89.  
  90. GetDPB6:
  91.     call    Strout
  92.     db    cr,lf,'Sectors are not interleaved',0
  93.  
  94. ;    Show the rest of the fields.
  95.  
  96. GetDPB8:
  97.     call    Strout
  98.     db    cr,lf,'Block Shift (BSH)............',0
  99.     mvi    a,2
  100.     call    GetField
  101.     mvi    h,0
  102.     call    ShowDec
  103.     call    Strout
  104.     db    cr,lf,'Block Mask (BLM).............',0
  105.     mvi    a,3
  106.     call    GetField
  107.     mvi    h,0
  108.     call    ShowDec
  109.     call    Strout
  110.     db    cr,lf,'Extent Mask (EXM)............',0
  111.     mvi    a,4
  112.     call    GetField
  113.     mvi    h,0
  114.     call    ShowDec
  115.     call    Strout
  116.     db    cr,lf,'Total Blocks (DSM)...........',0
  117.     mvi    a,5
  118.     call    GetField
  119.     call    ShowDec
  120.     call    Strout
  121.     db    cr,lf,'Directory Entries (DRM)......',0
  122.     mvi    a,7
  123.     call    GetField
  124.     call    ShowDec
  125.     call    Strout
  126.     db    cr,lf,'Allocation 0 (AL0)...........',0
  127.     mvi    a,9
  128.     call    GetField
  129.     mvi    h,0
  130.     call    ShowHex
  131.     call    Strout
  132.     db    cr,lf,'Allocation 1 (AL1)...........',0
  133.     mvi    a,10
  134.     call    GetField
  135.     mvi    h,0
  136.     call    ShowHex
  137.     call    Strout
  138.     db    cr,lf,'Cylinder Offset (OFS)........',0
  139.     mvi    a,13
  140.     call    GetField
  141.     call    ShowDec
  142.     call    Strout
  143.     db    cr,lf,lf,0        ; done...
  144.     jmp    wboot            ; exit...
  145.  
  146. ;*    Indirect call to (hl).
  147. ;
  148. ;    Simple, yet effective.
  149. ;
  150.  
  151. Indcall:
  152.     pchl            ; jmp to (hl)
  153.  
  154. ;*    GetField - Get a DPB field into (hl)
  155. ;
  156. ;    (a) = offset on entry.
  157. ;
  158.  
  159. GetField:
  160.     push    d
  161.     lhld    DPBaddr
  162.     mov    e,a
  163.     mvi    d,0
  164.     dad    d
  165.     mov    e,m
  166.     inx    h
  167.     mov    d,m
  168.     xchg
  169.     pop    d
  170.     ret
  171.  
  172.  
  173. ;*    Chout - Character in (a) to console output.
  174. ;
  175. ;    Preserves all but (a)
  176. ;
  177.  
  178. Chout:
  179.     push    h
  180.     push    b
  181.     push    d
  182.     mov    e,a
  183.     mvi    c,2
  184.     call    bdos            ; issue a console-out
  185.     pop    d
  186.     pop    b
  187.     pop    h
  188.     ret
  189.  
  190. ;*    Strout - Output a string following the call to this routine.
  191. ;
  192. ;    preserves all.
  193. ;
  194. ;    String is null-terminated.
  195. ;
  196.  
  197. Strout:
  198.     xthl                ; get return in (hl)
  199.     push    psw            ; save (a)
  200. Strout2:
  201.     mov    a,m
  202.     inx    h
  203.     ora    a
  204.     jz    Strout4            ; if done...
  205.     push    d
  206.     push    b
  207.     push    h
  208.     mov    e,a
  209.     mvi    c,2            ; console out
  210.     call    bdos
  211.     pop    h
  212.     pop    b
  213.     pop    d
  214.     jmp    Strout2
  215.  
  216. Strout4:
  217.     pop    psw
  218.     xthl
  219.     ret                ; exit...all regs preserved
  220.  
  221. ;*    ShowDec - Show (HL) as a decimal number.
  222. ;
  223. ;    Output to the console; blank leading zeroes.
  224. ;
  225.  
  226. ShowDec:
  227.     push    h
  228.     push    d
  229.     push    b
  230.     push    psw
  231.     lxi    d,DecTable    ; get powers table
  232.     xchg
  233.     mvi    c,0        ; say blanking
  234. ShowDec2:
  235.     mov    a,m
  236.     ora    a        ; see if last digit
  237.     jz    ShowDec8    ; if so
  238.     mvi    b,0
  239. ShowDec4:
  240.     inr    b
  241.     mov    a,e
  242.     sub    m
  243.     mov    e,a
  244.     inx    h
  245.     mov    a,d
  246.     sbb    m
  247.     mov    d,a
  248.     dcx    h
  249.     jnc    ShowDec4    ; if oversubtract
  250.  
  251. ;    correct oversubtract.
  252.  
  253.     mov    a,e
  254.     add    m
  255.     mov    e,a
  256.     inx    h
  257.     mov    a,d
  258.     adc    m
  259.     inx    h
  260.     mov    d,a
  261.     dcr    b
  262.     jz    ShowDec6    ; if a zero
  263.     mvi    c,1
  264. ShowDec6:
  265.     inr    c
  266.     dcr    c        ; check (c)
  267.     jz    ShowDec2    ; loop to next digit
  268.     mov    a,b
  269.     adi    '0'
  270.     call    chout        ; character out
  271.     jmp    ShowDec2    ; to next digit
  272.  
  273. ;    Do the last digit - do not blank.
  274.  
  275. ShowDec8:
  276.     mov    a,e
  277.     adi    '0'
  278.     call    chout
  279.     pop    psw
  280.     pop    b
  281.     pop    d
  282.     pop    h
  283.     ret
  284.  
  285. DecTable:
  286.     dw    10000,1000,100,10,0    ; powers of 10
  287.  
  288.  
  289. ;*    ShowHex - Show a string of hex digits.
  290. ;
  291. ;    On entry (HL) = value.
  292. ;
  293. ;    Output is to console, leading zeroes blanked.
  294. ;
  295.  
  296. ShowHex:
  297.     push    h
  298.     push    d
  299.     push    b
  300.     push    psw
  301.     lxi    b,0400h            ; 4 digits + blank indicator
  302. ShowHex2:
  303.     xra    a
  304.     dad    h
  305.     ral
  306.     dad    h
  307.     ral
  308.     dad    h
  309.     ral
  310.     dad    h
  311.     ral                ; isolate a digit in (a)
  312.     ora    a
  313.     jz    ShowHex4        ; if zero
  314.     mvi    c,1            ; say nonzero
  315. ShowHex4:
  316.     adi    '0'                     ; bias for ASCII
  317.     cpi    '9'+1
  318.     jc    ShowHex6        ; if 0-9
  319.     adi    'A'-'9'-1               ; make digits
  320. ShowHex6:
  321.     dcr    b
  322.     jz    ShowHex8        ; if last digit
  323.     inr    c
  324.     dcr    c
  325.     jz    ShowHex10        ; skip the leading zero
  326. ShowHex8:
  327.     call    chout
  328. ShowHex10:
  329.     inr    b
  330.     dcr    b
  331.     jnz    ShowHex2        ; if not done yet
  332.     pop    psw
  333.     pop    b
  334.     pop    d
  335.     pop    h
  336.     ret                ; exit...
  337.  
  338. DPBaddr dw    0        ; address of DPB
  339. DPHaddr dw    0        ; address of DPH
  340. SectTrk dw    0        ; sectors/track
  341.  
  342.     end    GetDPB
  343.